package com.woniuxy;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.util.ArrayList;
import java.util.List;

public class CodelGenerator {
    public static void main(String[] arg){
        // 代码生成器
        AutoGenerator autoGenerator = new AutoGenerator();
        // 全部配置
        GlobalConfig globalConfig =new GlobalConfig();
        // root path from system global variable
        String projectPath = System.getProperty("user.dir");
        // 设置自动生成的代码应该输出到哪个位置
        globalConfig.setOutputDir(projectPath+"/votesys/src/main/java");
        // set author
        globalConfig.setAuthor("zhouzhou");
        // if open the work dir(suggest false)
        globalConfig.setOpen(true);
        // if overwrite past code
        globalConfig.setFileOverride(false);
        // set name of service
        globalConfig.setServiceName("%sService");
        // set name of mapper
        globalConfig.setMapperName("%sDao");
        // entity field
        //globalConfig.setSwagger2(true);
        autoGenerator.setGlobalConfig(globalConfig);

        //datasource config
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/votesys?useUnicode=true&useSSL=false&characterEncoding=utf8");
        dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("zhouzhou,./");

        autoGenerator.setDataSource(dataSourceConfig);

        // package config
        PackageConfig packageConfig = new PackageConfig();
        // .setModuleName("Module Name")
        // package location when code generate
        packageConfig.setParent("com.woniuxy");
        // service package name
        packageConfig.setService("service");
        // mapper package name
        packageConfig.setMapper("dao");
        // entity package name
        packageConfig.setEntity("model");

        autoGenerator.setPackageInfo(packageConfig);

        // custom configure

        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 如果模板引擎是 freemarker
        //String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return projectPath + "/votesys/src/main/resources/com/woniuxy/dao"
                        + "/" + tableInfo.getEntityName() + "Dao" + StringPool.DOT_XML;
            }
        });

        cfg.setFileOutConfigList(focList);
        autoGenerator.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        // templateConfig.setEntity("templates/entity2.java");
        // templateConfig.setService();
        // templateConfig.setController();

        templateConfig.setXml(null);//设置生成的xml映射文件为空
        autoGenerator.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        //strategy.setInclude("vote_account","vote_account_role","vote_menus"
        //        ,"vote_role_menus","vote_role");
        strategy.setNaming(NamingStrategy.underline_to_camel);//设置下划线转驼峰
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//设置下划线转驼峰
//        strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        strategy.setEntityLombokModel(true);//生成代码时加lombok对应的注解
        strategy.setRestControllerStyle(true);//生成的控制层类上加@RestController
        // 公共父类
//        strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
//        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("id");
//        strategy.setInclude("表名，多个英文逗号分割");
//        strategy.setControllerMappingHyphenStyle(true);

        //strategy.setTablePrefix("t_");//去除表名的前缀

        autoGenerator.setStrategy(strategy);
        autoGenerator.setTemplateEngine(new VelocityTemplateEngine());//指定使用什么模板引擎
        autoGenerator.execute();
    }
}
